<?php
/**
 * Description of newsReader
 *
 * @author Damiano Ciarla
 */
class NewsReader
{
    const TYPE_TXT			= "readFromTxt";
	const TYPE_IMG_TXT		= "readFromImgTxt";
	const TYPE_TIT_TXT		= "readFromTitTxt";
	const TYPE_IMG_TIT_TXT	= "readFromImgTitTxt";

	const STYLE_1 = "style-1.php";
	const STYLE_2 = "style-2.php";
	const STYLE_3 = "style-3.php";

	private $newsList = array();
	private $newsType = null;

	private $style	= "style-2.php";

	private $widthBox	= "100%";
	private $heightBox	= "150";
	
	private $heightNews		= 150;
	private $imgNewsWidth	= 100;
	private $imgNewsHeight	= 100;
	private $wordLimit		= 400;

	private $newsForPage = 1;
	private $totNewsShow = 5;

	private $name	= null;
	private $title	= "";

	/**
	 * Parametri iniziali per iniziare a settare il componente 'NewsReader'
	 *
	 * @param string $name		Nome del componente 'NewsReader'. Se ci sono più componenti il nome deve essere univoco
	 * @param array	$newsList	Array contenente le news da visualizzare
	 * @param string $newsType	Tipo di news da visualizzare. Scegliere tra le costanti presenti nel componente con suffisso 'TYPE_'
	 */

	public function __construct($name, $newsList = null, $newsType = null)
	{
		$this->name = $name;
		
		$this->newsList = $newsList;
		$this->newsType = $newsType;
	}

	/**
	 * Imposta i parametri necessari alla creazione del Box per la visualizzazione
	 * delle NEWS. Se questa funzione non viene chiamata il BOX avra' i valori di
	 * default corrispondenti a:
	 *
	 * WIDTH		= 100%
	 * HEIGHT		= 150
	 * TOTNEWSSHOW	= 5
	 *
	 * @param string $width			Larghezza BOX
	 * @param string $height		Altezza BOX
	 * @param int $totNewsShow		Numero di news da visualizzare
	 * @param string $heigthNews	Altezza news
	 * @param int $newsForPage		Numero di news da visualizzare per pagina
	 */

	public function setBoxParam($width = null, $height = null, $totNewsShow = null, $heigthNews = null, $newsForPage = null)
	{
		if(!is_null($width))
		{
			$this->widthBox = $width;
		}

		if(!is_null($height))
		{
			$this->heightBox = $height;
		}

		if(!is_null($totNewsShow) and is_int($totNewsShow) and $totNewsShow > 0)
		{
			$this->totNewsShow = $totNewsShow;
		}

		if(!is_null($heigthNews) and is_int($heigthNews) and $heigthNews > 0)
		{
			$this->heightNews = $heigthNews;
		}

		if(!is_null($newsForPage) and is_int($newsForPage) and $newsForPage > 0)
		{
			$this->newsForPage = $newsForPage;
		}
	}

	public function setWidthBox($widthBox)
	{
		$this->widthBox = $widthBox;
	}

	public function setHeightBox($heightBox)
	{
		$this->heightBox = $heightBox;
	}

	public function setHeightNews($heightNews)
	{
		if(is_int($heightNews) and $heightNews > 0)
		{
			$this->heightNews = $heightNews;
		}
	}

	public function setImgNewsWidth($imgNewsWidth)
	{
		if(is_int($imgNewsWidth) and $imgNewsWidth > 0)
		{
			$this->imgNewsWidth = $imgNewsWidth;
		}
	}

	public function setImgNewsHeight($imgNewsHeight)
	{
		if(is_int($imgNewsHeight) and $imgNewsHeight > 0)
		{
			$this->imgNewsHeight = $imgNewsHeight;
		}
	}

	public function setWordLimit($wordLimit)
	{
		if(is_int($wordLimit) and $wordLimit > 0)
		{
			$this->wordLimit = $wordLimit;
		}
	}

	public function setNewsForPage($newsForPage)
	{
		if(is_int($newsForPage) and $newsForPage > 0)
		{
			$this->newsForPage = $newsForPage;
		}
	}

	public function setTotNewsShow($totNewsShow)
	{
		if(is_int($totNewsShow) and $totNewsShow > 0)
		{
			$this->totNewsShow = $totNewsShow;
		}
	}

	public function setStyle($style)
	{
		$this->style = $style;
	}

	public function setTitle($title)
	{
		$this->title = $title;
	}

	/**
	 * Imposta l'array che contiene le news che devono essere visualizzate.
	 *
	 * L'array deve essere nel seguente formato (esposte le 4 possibili combinazioni):
	 *
	 * TYPE_TXT			->	Array di Array associativi i quali contengono ID - TXT.
	 *						Es: $newsList[] = array('ID'=>'32', 'TXT'=>'Testo news')
	 *
	 * TYPE_IMG_TXT		->	Array di Array Associativi i quali contengono ID - IMG - TXT.
	 *						Es: $newsList[] = array('ID'=>'32', 'IMG'=>'url', 'TXT'=>'Testo news')
	 *
	 * TYPE_TIT_TXT		->	Array di Array Associativi i quali contengono ID - TIT - TXT.
	 *						Es: $newsList[] = array('ID'=>'32', 'TIT'=>'titolo', 'TXT'=>'Testo news')
	 * 
	 * TYPE_IMG_TIT_TXT	->	Array di Array Associativi i quali contengono ID - IMG - TIT - TXT.
	 *						Es: $newsList[] = array('ID'=>'32', 'IMG'=>'url', 'TIT'=>'titolo', 'TXT'=>'Testo news')
	 *
	 * @param array $newsList Array contenente la lista delle news da visualizzare
	 */

	public function setNewsList($newsList)
	{
		$this->newsList = $newsList;
	}

	/**
	 * Imposta di quale formato sono le news passate tramite array.
	 * Questo formato determina la visualizzazione di qeuste ultime nel Box che verra' creato
	 *
	 * @param string $newsType Tipo composizione news
	 */

	public function setNewsType($newsType)
	{
		$this->newsType = $newsType;
	}

	/**
	 * Metodo chiamato alla creazione delle news che controlla se i valori iniziali sono settati
	 * correttamente. Il ritorno del metodo e' il responso dei controlli effettuati
	 *
	 * @return boolean	Esito dei controlli iniziali
	 */

	private function startControl()
	{
		if(count($this->newsList) == 0)
		{
			echo	"<font color='red'><strong>" .
					TD_("COMPONENTE NEWS READER:", "components") .
					"</strong> " .
					TD_("Nessuna news caricata", "components") .
					"</font>";
			
			return false;
		}

		if(count($this->newsList) < $this->totNewsShow)
		{
			$this->totNewsShow = count($this->newsList);
		}

		return true;
	}

	/**
	 * Questo metodo si occupa di settare i valori inziali per la creazione del BOX delle news.
	 * Dopo aver eseguito le operazioni iniziali si occupa di includere il file PHP contenente il codice
	 * CSS creato dinamicamente per visualizzare correttamente il componente che si sta creando.
	 *
	 * @return string Stile CSS da usare per la visualizzazione delle news
	 */

	private function includeStyleSheet()
	{
		$widthWithoutPerc	= str_replace("%", "", $this->widthBox);
		$widthWithoutPixel	= str_replace("px", "", $this->widthBox);

		$heightWithoutPerc	= str_replace("%", "", $this->heightBox);
		$heightWithoutPixel	= str_replace("px", "", $this->heightBox);

		/* Se la news ha un'altezza maggiore di quella del BOX assegno alla news l'altezza del BOX */
		if($this->heightNews > $heightWithoutPixel) $this->heightNews = $heightWithoutPixel;

		/* Se la news ha un'altezza minore di quella del BOX e le news per pagina sono pari a 1 assegno alla news l'altezza del BOX */
		if($heightWithoutPixel > $this->heightNews and $this->newsForPage == 1) $this->heightNews = $heightWithoutPixel;

		/* Se le news da visualizzare nella pagina sono maggiori ad 1 assegno alla news un'altezza pari a quella del BOX diviso il numero delle news */
		if($this->newsForPage > 1) $this->heightNews = $this->heightBox / $this->newsForPage;

		include_once BXD_INCLUDEPATH . 'components/tools/newsReader/css/' . $this->style;

		return $style;
	}

	/**
	 * Metodo interno che si occupa di creare il codice per la visualizzazione del 'NewsReader' ciclando
	 * l'array di NEWS passato in precedenza e includendo il file CSS dinamico creato esternamente
	 *
	 * @return null	Blocca il codice se viene trovato un errore nell'inizializzazione del componente
	 */

	private function readAndPrintNews()
	{
		if(!$this->startControl()) return;

		$style = $this->includeStyleSheet();

		$action  = "<div id=\"actions-scrollable-news-" . $this->name . "\">";
		$action .= "<a class='prevPage'>Precedente</a>";
		$action .= "<a class='nextPage'>Successiva</a>";
		if($this->title != "") $action .= "<div class=\"scrollable-news-" . $this->name . "-title\">" . $this->title . "</div>";
		$action .= "</div>";

		$news  = "<div class=\"scrollable-news-border\">";

		$news .= $action;

		$news .= "<div class=\"scrollable-news-" . $this->name . " vertical\">";
		$news .= "<div class=\"items\">";

		for ($i = 0 ; $i < count($this->newsList) ; $i++)
		{
			$news .= "<div>";

			if($this->newsType == self::TYPE_IMG_TIT_TXT or $this->newsType == self::TYPE_IMG_TXT)
			{
				$news .= "<img src=\"" . $this->newsList[$i]['IMG'] . "\" border=\"0\" />";
			}
			
			if($this->newsType == self::TYPE_IMG_TIT_TXT or $this->newsType == self::TYPE_TIT_TXT)
			{
				$news .= "<p class=\"titleNews\">" . $this->newsList[$i]['TIT'] . "</p>";
			}

			if($this->wordLimit != "" and is_int($this->wordLimit))
			{
				$finalPoint = "";

				if(strlen($this->newsList[$i]['TXT']) > $this->wordLimit) $finalPoint = "...";

				$news .= substr($this->newsList[$i]['TXT'], 0, $this->wordLimit) . $finalPoint;
			}
			else
			{
				$news .= $this->newsList[$i]['TXT'];
			}

			$news .= "</div>";
		}

		$news .= "</div>";
		$news .= "</div>";
		$news .= "</div>";

		$script  = "<script>";
		$script .= "$(\"div.scrollable-news-" . $this->name . "\").scrollable({ vertical:true, size: " . $this->newsForPage . " });";
		$script .= "</script>";

		echo $style . $news . $script;
	}

	/**
	 * Stampa delle News a video. Se tutti i parametri sono stati settati correttamente viene
	 * stampato il codice per la visualizzazione del 'NewsReader' altrimenti il componente si
	 * blocca e viene stampato un messaggio di errore.
	 *
	 * @return null	Stoppa il metodo senza eseguire il resto del codice
	 */

	public function show()
	{
		if(is_null($this->newsType))
		{
			echo	"<font color='red'><strong>" .
					TD_("COMPONENTE NEWS READER:", "components") .
					"</strong> " .
					TD_("È obbligatorio specificare il tipo di news da visualizzare scegliendo una delle alternative proposte dalle costanti con suffisso <strong>'TYPE_'</strong>", "components") .
					"</font>";
			
			return;
		}

		$this->readAndPrintNews();
	}
}
?>
